package org.springblade.modules.admin.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.google.protobuf.ServiceException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tenant.annotation.TenantIgnore;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.admin.dto.RobotAddDTO;
import org.springblade.modules.admin.dto.RobotTenantDTO;
import org.springblade.modules.admin.entity.Robot;
import org.springblade.modules.admin.service.IRobotService;
import org.springblade.modules.admin.vo.RobotVO;
import org.springblade.modules.admin.vo.TenantRobotVO;
import org.springblade.modules.system.entity.Tenant;
import org.springblade.modules.system.service.ITenantService;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;


/**
 * 机器人管理控制器
 * 000000 租户 新增机器人并立即绑定
 * @author: Sharry
 * @createTime: 2023/5/17 17:13
 * @version: Version-1.0
 */
@Slf4j
@RestController
@RequestMapping("/send/robot")
@AllArgsConstructor
@Api(tags = "机器人管理接口" , value = "/send/robot")
public class RobotController {

	private final ITenantService tenantService;

	private final IRobotService robotService;

	/**
	 * 新增单个机器人
	 * @param robotAddDTO 新增所需参数，其中，机器人QRCode url 需要调用对象存储端点接口，并获取其bladeFile的url
	 * @return 是否成功
	 */
	@TenantIgnore
	@PostMapping("/addNew")
	@ApiOperation("新增机器人")
	@ApiOperationSupport(order = 10)
	public R<Boolean> addNew(@RequestBody RobotAddDTO robotAddDTO) throws ServiceException {
		// 参数校验
		String robotId = robotAddDTO.getRobotId();
		String robotQrCode = robotAddDTO.getRobotQrCode();
		String tenantId = robotAddDTO.getTenantId();
		if(Func.isNull(robotId) || Func.isNull(robotQrCode) || Func.isNull(tenantId)){
			throw new ServiceException("新增失败，参数不完整，请联系管理员");
		}
		// 若该机器人已存在
		Robot one = robotService.getOne(new LambdaQueryWrapper<Robot>().eq(Robot::getRobotId, robotId));
		if(!Func.isNull(one)){
			return R.fail("该机器人已存在了，请勿重复添加哦");
		}
		// 复制属性并插入
		Robot robot = new Robot();
		robot.setRobotId(robotId);
		robot.setRobotQrcode(robotQrCode);
		robot.setTenantId(tenantId);
		return R.data(robotService.save(robot));
	}


	/**
	 * 删除机器人-租户绑定关系
	 * @return 是否成功
	 */
	@TenantIgnore
	@PostMapping("/del/relationship")
	@ApiOperation("删除机器人-租户绑定关系")
	@ApiOperationSupport(order = 20)
	public R<Boolean> deleteRelationship(@RequestBody RobotTenantDTO robotTenantDTO){
		String robotId = robotTenantDTO.getRobotId();
		boolean b = robotService.deleteRelationship(robotId);
		return R.data(b);
	}

	/**
	 * 获取租户列表
	 * @return 租户列表
	 */
	@TenantIgnore
	@GetMapping("/getTenants")
	@ApiOperation("获取租户列表")
	@ApiOperationSupport(order = 30)
	public R<List<TenantRobotVO>> getTenants(){
		// 获取租户列表，并将关键信息赋值给VO列表
		List<TenantRobotVO> targetList = new ArrayList<>();
		List<Tenant> list = tenantService.list();
		list.forEach(l -> {
			TenantRobotVO resultVO = new TenantRobotVO();
			resultVO.setTenantName(l.getTenantName());
			resultVO.setTenantId(l.getTenantId());
			// 预留字段 name 拼接
			resultVO.setName(resultVO.getTenantName() + "/" + resultVO.getTenantId());
			targetList.add(resultVO);
		});
		return R.data(targetList);
	}

	/**
	 * 获取租户列表，支持模糊查询
	 * @param name 模糊搜索条件
	 * @return 租户列表
	 */
	@TenantIgnore
	@GetMapping("/getTenants/byName")
	@ApiOperation("模糊查询获取租户列表")
	@ApiOperationSupport(order = 31)
	public R<List<TenantRobotVO>> getTenantsByName(String name){
		List<TenantRobotVO> targetList = tenantService.listByName(name);
		return R.data(targetList);
	}

	/**
	 *  根据搜索条件获取机器人列表
	 */
	@TenantIgnore
	@PostMapping("/getList")
	@ApiOperation("根据搜索条件获取机器人列表")
	@ApiOperationSupport(order = 32)
	public R<List<RobotVO>> getList(@RequestBody RobotTenantDTO robotTenantDTO){
		// 机器人微信号
		String robotId = robotTenantDTO.getRobotId();
		String tenantId = robotTenantDTO.getTenantRobotVO().getTenantId();
		List<RobotVO> robotVOList = robotService.getListByCondition(robotId,tenantId);
		return R.data(robotVOList);
	}

	/**
	 * 编辑机器人
	 */
	@TenantIgnore
	@PostMapping("/edit")
	@ApiOperation("编辑机器人信息")
	@ApiOperationSupport(order = 40)
	public R<Boolean> edit(@RequestBody RobotTenantDTO robotTenantDTO){
		String robotId = robotTenantDTO.getRobotId();
		RobotAddDTO robotAddDTO = robotTenantDTO.getRobotAddDTO();
		boolean b = robotService.edit(robotId,robotAddDTO);
		return R.data(b);
	}



}
